#pragma once
#ifndef UTILS_H
#define UTILS_H

#define WINDOWS 0
#define LINUX 1
// OS默认是windows
#define OS LINUX

#include <stdlib.h>
#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include <malloc.h>

/**
 * 使用长度打印字符.
 *
 * \param str 字符串
 * \param len 长度
 */
void println_by_len(char *str, int len);
/**
 * 打印字符.
 *
 * \param str 字符串
 */
void println(char *str);

void println_by_len(char *str, int len)
{
    int strLen = strlen(str);
    int strHalf = strLen / 2;

    // 去除前后两个*
    int half = len / 2 - 1;

    // 有三层
    // 第一层和第二层全是*
    // 中间层是* 空格 文字 空格 * 有5部分

    // 第一层
    for (int i = 0; i < len; i++)
    {
        printf("*");
    }

    printf("\n");

    // 中间层
    // 分为5部分 * 空格 文字 空格 * 有5部分
    // 左边的空格长度
    int leftLen = half + strHalf - strLen;
    // 右边的空格长度
    int rightLen = half - strHalf;

    // 左边的*
    printf("*");

    // 左边的空格
    for (int i = 0; i < leftLen; i++)
    {
        printf(" ");
    }

    // 中间文字
    printf("%s", str);

    // 右边的空格
    for (int i = 0; i < rightLen; i++)
    {
        printf(" ");
    }

    // 右边的*
    printf("*\n");

    // 第三层
    for (int i = 0; i < len; i++)
    {
        printf("*");
    }

    printf("\n");
}

#if (OS == WINDOWS)
#include <windows.h>
void println(char *str)
{
    // 默认总长度40
    // int defaultLen = 40;

    // 获取控制台窗口的宽度
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi);

    int defaultLen = csbi.srWindow.Right - csbi.srWindow.Left + 1;

    println_by_len(str, defaultLen);
}

#else
#include <sys/types.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <termios.h>

void println(char *str)
{
    // 默认总长度40
    // int defaultLen = 40;
    // 获取控制台窗口的宽度
    struct winsize size;

    ioctl(STDIN_FILENO, TIOCGWINSZ, &size);

    int defaultLen = size.ws_col;
    println_by_len(str, defaultLen);
}
#endif

#endif
